package momo.multitree.algo;

import momo.multitree.structure.*;

import java.io.FileReader;

import junit.framework.TestCase;


public class EdmundAlgoTest extends TestCase
{
	public void testNoCycle()
	{
		Node n1 = new Node("1", 1, 1);
		Node n2 = new Node("2", 1, 2);
		Node n3 = new Node("3", 1, 9);
		Node n4 = new Node("4", 1, 4);
		Node n5 = new Node("5", 1, 5);
		Node n6 = new Node("6", 1, 8);
		
		Edge e1 = new Edge("1", n1, n2, 1, 1, 1, 1);
		Edge e2 = new Edge("2", n1, n3, 1, 1, 1, 1);
		Edge e3 = new Edge("3", n2, n4, 1, 1, 1, 1);
		Edge e4 = new Edge("4", n3, n4, 1, 1, 1, 1);
		Edge e5 = new Edge("5", n2, n5, 1, 1, 1, 1);
		Edge e6 = new Edge("6", n4, n5, 1, 1, 1, 1);
		Edge e7 = new Edge("7", n4, n6, 1, 1, 1, 1);
		Edge e8 = new Edge("8", n3, n6, 1, 1, 1, 1);
		Edge e9 = new Edge("9", n5, n6, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(e1);
		graph.add(e2);
		graph.add(e3);
		graph.add(e4);
		graph.add(e5);
		graph.add(e6);
		graph.add(e7);
		graph.add(e8);
		graph.add(e9);
		
		EdmundAlgo test = new EdmundAlgo(graph) ;
		Tree actual = test.optimumTree();
		
		Tree expected = new Tree(n1);
		expected.add(e1);
		expected.add(e2);
		expected.add(e3);
		expected.add(e5);
		expected.add(e7);
		
		assertTrue(actual.compare(expected));
		assertTrue(!actual.hasCycle());
		assertTrue(actual.isConnectedGraph());
	}
	
	public void testOneCycle()
	{
		Node n1 = new Node("1", 1, 1);
		Node n2 = new Node("2", 1, 9);
		Node n3 = new Node("3", 1, 9);
		Node n4 = new Node("4", 1, 5);
		Node n5 = new Node("5", 1, 4);
		Node n6 = new Node("6", 1, 3);
		
		Edge e1 = new Edge("1", n1, n2, 1, 1, 1, 1);
		Edge e2 = new Edge("2", n1, n3, 1, 1, 1, 1);
		Edge e3 = new Edge("3", n2, n4, 1, 1, 1, 1);
		Edge e4 = new Edge("4", n3, n4, 1, 1, 1, 1);
		Edge e5 = new Edge("5", n2, n5, 1, 1, 1, 1);
		Edge e6 = new Edge("6", n4, n5, 1, 1, 1, 1);
		Edge e7 = new Edge("7", n4, n6, 1, 1, 1, 1);
		Edge e8 = new Edge("8", n3, n6, 1, 1, 1, 1);
		Edge e9 = new Edge("9", n5, n6, 1, 1, 1, 1);
		
		Graph graph = new Graph();
		graph.add(e1);
		graph.add(e2);
		graph.add(e3);
		graph.add(e4);
		graph.add(e5);
		graph.add(e6);
		graph.add(e7);
		graph.add(e8);
		graph.add(e9);
		
		EdmundAlgo test = new EdmundAlgo(graph) ;
		Tree actualTree = test.optimumTree();
		
		double actual = actualTree.compStability();
		double expected = 17d;
		assertEquals(expected, actual, 0.0000001);
		assertTrue(!actualTree.hasCycle());
		assertTrue(actualTree.isConnectedGraph());
	}
	
	public void testTwoDiffCycle()
	{
		Node n1 = new Node("1", 1, 1);
		Node n2 = new Node("2", 1, 6);
		Node n3 = new Node("3", 1, 10);
		Node n4 = new Node("4", 1, 7);
		Node n5 = new Node("5", 1, 8);
		Node n6 = new Node("6", 1, 5);
		Node n7 = new Node("7", 1, 7);
		Node n8 = new Node("8", 1, 6);
		
		Edge e1 = new Edge ("1", n1, n2, 1, 1, 1, 1);
		Edge e2 = new Edge ("2", n1, n3, 1, 1, 1, 1);
		Edge e3 = new Edge ("3", n2, n4, 1, 1, 1, 1);
		Edge e4 = new Edge ("4", n3, n4, 1, 1, 1, 1);
		Edge e5 = new Edge ("5", n2, n5, 1, 1, 1, 1);
		Edge e6 = new Edge ("6", n4, n5, 1, 1, 1, 1);
		Edge e7 = new Edge ("7", n3, n6, 1, 1, 1, 1);
		Edge e8 = new Edge ("8", n3, n8, 1, 1, 1, 1);
		Edge e9 = new Edge ("9", n5, n6, 1, 1, 1, 1);
		Edge e10 = new Edge ("10", n5, n7, 1, 1, 1, 1);
		Edge e11 = new Edge ("11", n7, n8, 1, 1, 1, 1);
		
		Graph g = new Graph();
		g.add(e1);
		g.add(e2);
		g.add(e3);
		g.add(e4);
		g.add(e5);
		g.add(e6);
		g.add(e7);
		g.add(e8);
		g.add(e9);
		g.add(e10);
		g.add(e11);
		
		EdmundAlgo test = new EdmundAlgo(g) ;
		Tree actualTree = test.optimumTree();
		
		double actual = actualTree.compStability();
		double expected = 37d;
		assertEquals(expected, actual, 0.0000001);
		assertTrue(!actualTree.hasCycle());
		assertTrue(actualTree.isConnectedGraph());
	}
	
	public void testDataSet() throws Exception
	{
//		Graph g = new Graph(new FileReader("dataset/stab_fail_testset.txt"));
//		EdmundAlgo test = new EdmundAlgo(g) ;
//		Tree actualTree = test.optimumTree();
//		
//		System.out.println(actualTree.toString());
		
	}
	
	public void testOneSubsequentOneCycle()
	{
	}
	
	
}//end of class EdmundAlgoTest
